home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_xemacs.idb / usr / freeware / lib / xemacs-20.4 / lisp / cc-mode / cc-compat.el.z / cc-compat.el
Encoding:
Text File  |  1998-05-21  |  5.1 KB  |  150 lines

  1. ;;; cc-compat.el --- cc-mode compatibility with c-mode.el confusion
  2.  
  3. ;; Copyright (C) 1985,87,92,93,94,95,96,97 Free Software Foundation, Inc.
  4.  
  5. ;; Author:     1994-1997 Barry A. Warsaw
  6. ;; Maintainer: cc-mode-help@python.org
  7. ;; Created:    August 1994, split from cc-mode.el
  8. ;; Version:    See cc-mode.el
  9. ;; Keywords:   c languages oop
  10.  
  11. ;; This file is part of GNU Emacs.
  12.  
  13. ;; GNU Emacs is free software; you can redistribute it and/or modify
  14. ;; it under the terms of the GNU General Public License as published by
  15. ;; the Free Software Foundation; either version 2, or (at your option)
  16. ;; any later version.
  17.  
  18. ;; GNU Emacs is distributed in the hope that it will be useful,
  19. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  21. ;; GNU General Public License for more details.
  22.  
  23. ;; You should have received a copy of the GNU General Public License
  24. ;; along with GNU Emacs; see the file COPYING.  If not, write to the
  25. ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  26. ;; Boston, MA 02111-1307, USA.
  27.  
  28. ;;; Commentary:
  29. ;;
  30. ;; Boring old c-mode.el (BOCM) is confusion and brain melt. cc-mode.el
  31. ;; is clarity of thought and purity of chi. If you are still unwilling
  32. ;; to accept enlightenment, this might help, or it may prolong your
  33. ;; agony.
  34. ;;
  35. ;; To use, add the following to your c-mode-hook:
  36. ;;
  37. ;; (require 'cc-compat)
  38. ;; (c-set-style "BOCM")
  39.  
  40. ;;; Code:
  41.  
  42. (eval-when-compile
  43.   (require 'cc-styles)
  44.   (require 'cc-engine))
  45.  
  46.  
  47. ;; In case c-mode.el isn't loaded
  48. (defvar c-indent-level 2
  49.   "*Indentation of C statements with respect to containing block.")
  50. (defvar c-brace-imaginary-offset 0
  51.   "*Imagined indentation of a C open brace that actually follows a statement.")
  52. (defvar c-brace-offset 0
  53.   "*Extra indentation for braces, compared with other text in same context.")
  54. (defvar c-argdecl-indent 5
  55.   "*Indentation level of declarations of C function arguments.")
  56. (defvar c-label-offset -2
  57.   "*Offset of C label lines and case statements relative to usual indentation.")
  58. (defvar c-continued-statement-offset 2
  59.   "*Extra indent for lines not starting new statements.")
  60. (defvar c-continued-brace-offset 0
  61.   "*Extra indent for substatements that start with open-braces.
  62. This is in addition to c-continued-statement-offset.")
  63.  
  64.  
  65.  
  66. ;; these offsets are taken by brute force testing c-mode.el, since
  67. ;; there's no logic to what it does.
  68. (let* ((offsets    '(c-offsets-alist .
  69.             ((defun-block-intro     . cc-block-intro-offset)
  70.              (statement-block-intro . cc-block-intro-offset)
  71.              (defun-open            . 0)
  72.              (class-open            . 0)
  73.              (inline-open           . c-brace-offset)
  74.              (block-open            . c-brace-offset)
  75.              (block-close           . cc-block-close-offset)
  76.              (brace-list-open       . c-brace-offset)
  77.              (substatement-open     . cc-substatement-open-offset)
  78.              (substatement          . c-continued-statement-offset)
  79.              (knr-argdecl-intro     . c-argdecl-indent)
  80.              (case-label            . c-label-offset)
  81.              (access-label          . c-label-offset)
  82.              (label                 . c-label-offset)
  83.              ))))
  84.   (c-add-style "BOCM" offsets))
  85.  
  86.  
  87. (defun cc-block-intro-offset (langelem)
  88.   ;; taken directly from calculate-c-indent confusion
  89.   (save-excursion
  90.     (c-backward-syntactic-ws)
  91.     (if (eq (char-before) ?{)
  92.     (forward-char -1)
  93.       (goto-char (cdr langelem)))
  94.     (let* ((curcol (save-excursion 
  95.              (goto-char (cdr langelem))
  96.              (current-column)))
  97.       (bocm-lossage
  98.        ;; If no previous statement, indent it relative to line
  99.        ;; brace is on.  For open brace in column zero, don't let
  100.        ;; statement start there too.  If c-indent-level is zero,
  101.        ;; use c-brace-offset + c-continued-statement-offset
  102.        ;; instead.  For open-braces not the first thing in a line,
  103.        ;; add in c-brace-imaginary-offset.
  104.        (+ (if (and (bolp) (zerop c-indent-level))
  105.           (+ c-brace-offset c-continued-statement-offset)
  106.         c-indent-level)
  107.           ;; Move back over whitespace before the openbrace.  If
  108.           ;; openbrace is not first nonwhite thing on the line,
  109.           ;; add the c-brace-imaginary-offset.
  110.           (progn (skip-chars-backward " \t")
  111.              (if (bolp) 0 c-brace-imaginary-offset))
  112.           ;; If the openbrace is preceded by a parenthesized exp,
  113.           ;; move to the beginning of that; possibly a different
  114.           ;; line
  115.           (progn
  116.         (if (eq (char-before) ?\))
  117.             (forward-sexp -1))
  118.         ;; Get initial indentation of the line we are on.
  119.         (current-indentation)))))
  120.       (- bocm-lossage curcol))))
  121.  
  122.  
  123. (defun cc-block-close-offset (langelem)
  124.   (save-excursion
  125.     (let* ((here (point))
  126.        bracep 
  127.        (curcol (progn
  128.              (goto-char (cdr langelem))
  129.              (current-column)))
  130.        (bocm-lossage (progn
  131.                (goto-char (cdr langelem))
  132.                (if (eq (char-after) ?{)
  133.                    (setq bracep t)
  134.                  (goto-char here)
  135.                  (beginning-of-line)
  136.                  (backward-up-list 1)
  137.                  (forward-char 1)
  138.                  (c-forward-syntactic-ws))
  139.                (current-column))))
  140.       (- bocm-lossage curcol
  141.      (if bracep 0 c-indent-level)))))
  142.       
  143.  
  144. (defun cc-substatement-open-offset (langelem)
  145.   (+ c-continued-statement-offset c-continued-brace-offset))
  146.  
  147.  
  148. (provide 'cc-compat)
  149. ;;; cc-compat.el ends here
  150.